package info.motteke.mixivoice4j.http.html;

import info.motteke.mixivoice4j.ImageUrl;
import info.motteke.mixivoice4j.MixiVoiceException;
import info.motteke.mixivoice4j.http.StringImageUrl;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

/**
 * ホーム画面です。
 *
 * @author Y.Wakamatsu
 *
 */
public class Home {

    private final Document doc;

    private final Elements contents;

    /**
     * コンストラクタです。
     *
     * @param html ホーム画面のhtml
     */
    public Home(String html) {
        doc = Jsoup.parse(html);
        contents = doc.select("div#myArea > div.profilePhoto > div.contents > p");
    }

    /**
     * ログインしたユーザのIDを取得します。
     *
     * @return ユーザID
     */
    public long getUserId() {
        Elements a = doc.select("li.profile > a");

        if (a.size() == 0) {
            throw new MixiVoiceException("ホーム画面にプロフィールへのリンクがありません。");
        }

        String url = a.attr("href");
        return Long.parseLong(url.replaceAll(".+id=([0-9]+).+", "$1"));
    }

    /**
     * ログインしたユーザのサムネイルを取得します。
     *
     * @return サムネイルのURL
     */
    public ImageUrl getThumbnail() {
        Elements img = contents.select(".photo > a > img");

        if (img.size() == 0) {
            throw new MixiVoiceException("ホーム画面にサムネイルがありません。");
        }
        return new StringImageUrl(img.attr("src"));
    }

    /**
     * ログインしたユーザのニックネームを取得します。
     *
     * @return ニックネーム
     */
    public String getNickName() {
        Elements nameHolder = contents.select(".name > span:eq(0)");

        if (nameHolder.size() == 0) {
            throw new MixiVoiceException("ホーム画面にニックネームがありません。");
        }
        String userName = nameHolder.text();
        return userName.replaceAll("\\w*(.+)さん\\([0-9]+\\)\\w*", "$1");
    }

    /**
     * ログインしたユーザのポストキーを取得します。
     *
     * @return ポストキー
     */
    public String getPostKey() {
        Elements postKey = doc.select("#post_key");

        if (postKey.size() == 0) {
            throw new MixiVoiceException("ホーム画面にポストキーがありません。");
        }
        return postKey.val();
    }
}
